/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package uy.edu.ort.gestionareasriesgo.beans;

import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.primefaces.event.map.MarkerDragEvent;
import org.primefaces.model.DualListModel;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.MapModel;
import org.primefaces.model.map.Marker;
import org.primefaces.model.map.Polygon;
import uy.edu.ort.gestionareasriesgo.entidades.AreaRiesgo;
import uy.edu.ort.gestionareasriesgo.entidades.FactorRiesgo;
import uy.edu.ort.gestionareasriesgo.entidades.PuntosReferencia;
import uy.edu.ort.gestionareasriesgo.entidades.RelacionAreaFactor;
import uy.edu.ort.gestionareasriesgo.persistencia.HelperPersistencia;

/**
 *
 * @author Mattahari
 */
public class BeanAreasRiesgo {

    /**
     * Creates a new instance of BeanAreasRiesgo
     */
    public BeanAreasRiesgo() {
        //Inicializacion de todo
        cargarListaAreasRiesgo();
        cargarListaFactoresRiesgo();
        cargarDualList();
        inicializarPredefinidas();
        areaRiesgoNueva = new AreaRiesgo();
        factorActual = new FactorRiesgo();
        inicializarMapa();
    }
    private List<AreaRiesgo> listaAreasRiesgo;

    public List<AreaRiesgo> getListaAreasRiesgo() {
        cargarListaAreasRiesgo();
        return listaAreasRiesgo;
    }

    public void setListaAreasRiesgo(List<AreaRiesgo> listaAreasRiesgo) {
        this.listaAreasRiesgo = listaAreasRiesgo;
    }

    public void cargarListaAreasRiesgo() {
        listaAreasRiesgo = HelperPersistencia.obtenerAreasRiesgo();
    }
    private AreaRiesgo areaRiesgoNueva;

    public AreaRiesgo getAreaRiesgoNueva() {
        return areaRiesgoNueva;
    }

    public void setAreaRiesgoNueva(AreaRiesgo areaRiesgoNueva) {
        this.areaRiesgoNueva = areaRiesgoNueva;
    }

    private boolean validarGuardar() {        
        if (areaRiesgoNueva.getCodigoArea() == null || areaRiesgoNueva.getCodigoArea().equals("")) {            
            FacesMessage mensaje = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "El codigo de area no puede ser vacio");
            FacesContext.getCurrentInstance().addMessage(null, mensaje);
            return false;
        }
         if (areaRiesgoNueva.getCodigoArea().length()>5) {            
            FacesMessage mensaje = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "El codigo de area no puede ser de largo mayor a 5");
            FacesContext.getCurrentInstance().addMessage(null, mensaje);
            return false;
        }
        if (HelperPersistencia.existeAreaRiesgo(areaRiesgoNueva.getCodigoArea().trim())) {
            int numero = 1;
            String nombre = areaRiesgoNueva.getCodigoArea();
            while (HelperPersistencia.existeAreaRiesgo(areaRiesgoNueva.getCodigoArea())) {
                areaRiesgoNueva.setCodigoArea(nombre + "_" + (numero < 10 ? "0" : "") + numero);
                numero++;
            }
            FacesMessage mensaje = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "El codigo de area ya existe");
            FacesContext.getCurrentInstance().addMessage(null, mensaje);
            return false;
        }
        if (areaRiesgoNueva.getNombre() == null || areaRiesgoNueva.getNombre().equals("")) {
            FacesMessage mensaje = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "El nombre del area no puede ser vacio");
            FacesContext.getCurrentInstance().addMessage(null, mensaje);
            return false;
        }
        if (areaRiesgoNueva.getNombre().length()>25) {            
            FacesMessage mensaje = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "El nombre de area no puede ser de largo mayor a 25");
            FacesContext.getCurrentInstance().addMessage(null, mensaje);
            return false;
        }
        if (HelperPersistencia.existeNombreAreaRiesgo(areaRiesgoNueva.getNombre())) {
            int numero = 1;
            String nombre = areaRiesgoNueva.getNombre();
            while (HelperPersistencia.existeNombreAreaRiesgo(areaRiesgoNueva.getNombre())) {
                areaRiesgoNueva.setNombre(nombre + "_" + (numero < 10 ? "0" : "") + numero);
                numero++;
            }
            FacesMessage mensaje = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "El nombre de area ya existe");
            FacesContext.getCurrentInstance().addMessage(null, mensaje);
            return false;
        }
        if (areaRiesgoNueva.getNivelCapacitacion() == null || areaRiesgoNueva.getNivelCapacitacion().equals("")) {
            FacesMessage mensaje = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Debe elegir un nivel de capacitacion para el area");
            FacesContext.getCurrentInstance().addMessage(null, mensaje);
            return false;
        }
        if (dualListModel.getTarget().isEmpty()) {
            FacesMessage mensaje = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Se requiere al menos un factor de riesgo para el area");
            FacesContext.getCurrentInstance().addMessage(null, mensaje);
            return false;
        }
        if (seleccionRadio.equalsIgnoreCase(SELECCION_PREDEFINIDAS)) {
            if (areaRiesgoNueva.getEdificio() == null || areaRiesgoNueva.getEdificio().equals("")) {
                FacesMessage mensaje = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Se requiere la seleccion de edificio");
                FacesContext.getCurrentInstance().addMessage(null, mensaje);
                return false;
            }
            if (areaRiesgoNueva.getPlanta() == null || areaRiesgoNueva.getPlanta().equals("")) {
                FacesMessage mensaje = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Se requiere la seleccion de planta");
                FacesContext.getCurrentInstance().addMessage(null, mensaje);
                return false;
            }
            if (areaRiesgoNueva.getSector() == null || areaRiesgoNueva.getSector().equals("")) {
                FacesMessage mensaje = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Se requiere la seleccion de sector");
                FacesContext.getCurrentInstance().addMessage(null, mensaje);
                return false;
            }
            if (areaRiesgoNueva.getOrientacion() == null || areaRiesgoNueva.getOrientacion().equals("")) {
                FacesMessage mensaje = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Se requiere la seleccion de orientacion");
                FacesContext.getCurrentInstance().addMessage(null, mensaje);
                return false;
            }

        }
        return true;
    }

    public void guardarAreaRiesgo() {
        if (validarGuardar()) {
            HelperPersistencia.guardarGenerico(areaRiesgoNueva);
            for (String s : dualListModel.getTarget()) {
                RelacionAreaFactor r = new RelacionAreaFactor();
                r.setIdArea(areaRiesgoNueva.getId());
                r.setCodigoFactor(s.split("-")[0]);
                r.setNombreFactor(s.split("-")[1]);
                HelperPersistencia.guardarGenerico(r);
            }
            //Guardar puntos de referencia
            if (seleccionRadio == SELECCION_MAPA) {
                int i = 0;
                for (Marker marker : modeloMapa.getMarkers()) {
                    LatLng coordenadaActual = null;
                    PuntosReferencia p = new PuntosReferencia();
                    if (!marker.getTitle().equals("Puerta")) {
                        switch (i) {
                            case 0: {
                                coord1 = marker.getLatlng();
                                coordenadaActual = coord1;
                                break;
                            }
                            case 1: {
                                coord2 = marker.getLatlng();
                                coordenadaActual = coord2;
                                break;
                            }
                            case 2: {
                                coord3 = marker.getLatlng();
                                coordenadaActual = coord3;
                                break;
                            }
                            case 3: {
                                coord4 = marker.getLatlng();
                                coordenadaActual = coord4;
                                break;
                            }
                        }
                        p.setTipo("Vertice");
                    } else {
                        coordPuerta = marker.getLatlng();
                        p.setTipo("Puerta");
                        coordenadaActual = coordPuerta;
                    }
                    p.setIdPadre(areaRiesgoNueva.getId());
                    p.setLat(coordenadaActual.getLat());
                    p.setLon(coordenadaActual.getLng());
                    p.setTipoPadre("AREA");
                    HelperPersistencia.guardarGenerico(p);
                    i++;
                }
            }
            //crear nueva area de riesgo para proxima alta
            areaRiesgoNueva = new AreaRiesgo();
            cargarDualList();
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Exito", "Area de riesgo guardada"));
        }
    }
    private FactorRiesgo factorActual;

    public FactorRiesgo getFactorActual() {
        return factorActual;
    }

    public void setFactorActual(FactorRiesgo factorActual) {
        this.factorActual = factorActual;
    }

    public void guardarFactorRiesgo() {
        HelperPersistencia.guardarGenerico(factorActual);
        factorActual = new FactorRiesgo();
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Exito", "Factor de riesgo guardada"));
    }
    private List<FactorRiesgo> listaFactoresRiesgo;

    public List<FactorRiesgo> getListaFactoresRiesgo() {
        return listaFactoresRiesgo;
    }

    public void setListaFactoresRiesgo(List<FactorRiesgo> listaFactoresRiesgo) {
        this.listaFactoresRiesgo = listaFactoresRiesgo;
    }

    public void cargarListaFactoresRiesgo() {
        listaFactoresRiesgo = HelperPersistencia.obtenerFactoresRiesgo();
        cargarDualList();
    }
    //<editor-fold desc="seleccion tipo de georreferencia">
    private String seleccionRadio = "1";
    private static final String SELECCION_MAPA = "1";
    private static final String SELECCION_PREDEFINIDAS = "2";

    public String getSeleccionRadio() {
        return seleccionRadio;
    }

    public void setSeleccionRadio(String seleccionRadio) {
        this.seleccionRadio = seleccionRadio;
    }
    //predefinidas
    public List<String> edificio;
    public List<String> planta;
    public List<String> sector;
    public List<String> orientacion;

    public List<String> getEdificio() {
        return edificio;
    }

    public void setEdificio(List<String> edificio) {
        this.edificio = edificio;
    }

    public List<String> getPlanta() {
        return planta;
    }

    public void setPlanta(List<String> planta) {
        this.planta = planta;
    }

    public List<String> getSector() {
        return sector;
    }

    public void setSector(List<String> sector) {
        this.sector = sector;
    }

    public List<String> getOrientacion() {
        return orientacion;
    }

    public void setOrientacion(List<String> orientacion) {
        this.orientacion = orientacion;
    }

    private void inicializarPredefinidas() {
        edificio = new ArrayList<String>();
        edificio.add("");
        edificio.add("Central");
        edificio.add("Administracion");
        edificio.add("Fabrica");
        planta = new ArrayList<String>();
        planta.add("");
        planta.add("PB");
        planta.add("1");
        planta.add("2");
        planta.add("3");
        sector = new ArrayList<String>();
        sector.add("");
        sector.add("A");
        sector.add("B");
        sector.add("C");
        orientacion = new ArrayList<String>();
        orientacion.add("");
        orientacion.add("norte");
        orientacion.add("noreste");
        orientacion.add("este");
        orientacion.add("sureste");
        orientacion.add("sur");
        orientacion.add("suroeste");
        orientacion.add("oeste");
        orientacion.add("noroeste");
        orientacion.add("centro");
    }
    //</editor-fold>
    //<editor-fold desc="dual list factores riesgo">
    private DualListModel<String> dualListModel;

    public DualListModel<String> getDualListModel() {
        return dualListModel;
    }

    public void setDualListModel(DualListModel<String> dualListModel) {
        this.dualListModel = dualListModel;
    }

    public void cargarDualList() {

        ArrayList<String> listaFactoresString = new ArrayList<String>();
        for (FactorRiesgo f : listaFactoresRiesgo) {
            listaFactoresString.add(f.getCodigo() + "-" + f.getNombre());
        }
        dualListModel = new DualListModel<String>(listaFactoresString, new ArrayList<String>());
    }
    //</editor-fold>
    //<editor-fold desc="niveles capacitacion">
    private List<String> nivelesCapacitacion;

    public List<String> getNivelesCapacitacion() {
        nivelesCapacitacion = new ArrayList<String>();
        nivelesCapacitacion.add("A");
        nivelesCapacitacion.add("B");
        nivelesCapacitacion.add("C");
        nivelesCapacitacion.add("D");
        nivelesCapacitacion.add("E");
        nivelesCapacitacion.add("F");
        return nivelesCapacitacion;
    }
    //</editor-fold>
    //<editor-fold desc="Mapa">
    private MapModel modeloMapa;
    private LatLng coord1;
    private LatLng coord2;
    private LatLng coord3;
    private LatLng coord4;
    private LatLng coordPuerta;

    private void inicializarMapa() {
        modeloMapa = new DefaultMapModel();
        coord1 = new LatLng(36.879466, 30.667648);
        coord2 = new LatLng(36.883707, 30.689216);
        coord3 = new LatLng(36.879703, 30.706707);
        coord4 = new LatLng(36.885233, 30.702323);
        coordPuerta = new LatLng(36.885233, 30.702323);


        //Draggable  
        modeloMapa.addOverlay(new Marker(coord1, "Vertice"));
        modeloMapa.addOverlay(new Marker(coord2, "Vertice"));
        modeloMapa.addOverlay(new Marker(coord3, "Vertice"));
        modeloMapa.addOverlay(new Marker(coord4, "Vertice"));
        modeloMapa.addOverlay(new Marker(coordPuerta, "Puerta"));



        for (Marker marker : modeloMapa.getMarkers()) {
            marker.setDraggable(true);
        }

    }

    public MapModel getModeloMapa() {
        return modeloMapa;
    }

    private void dibujarPoligono() {
        Polygon polygon = new Polygon();
        int i = 0;
        for (Marker marker : modeloMapa.getMarkers()) {
            if (!marker.getTitle().equals("Puerta")) {
                switch (i) {
                    case 0: {
                        coord1 = marker.getLatlng();
                        break;
                    }
                    case 1: {
                        coord2 = marker.getLatlng();
                        break;
                    }
                    case 2: {
                        coord3 = marker.getLatlng();
                        break;
                    }
                    case 3: {
                        coord4 = marker.getLatlng();
                        break;
                    }
                }
                polygon.getPaths().add(marker.getLatlng());
            } else {
                coordPuerta = marker.getLatlng();
            }
            i++;
        }
        polygon.setId("poligono");
        polygon.setStrokeColor("#FF9900");
        polygon.setFillColor("#FF9900");
        polygon.setStrokeOpacity(0.7);
        polygon.setFillOpacity(0.1);
        modeloMapa.getPolygons().clear();
        modeloMapa.addOverlay(polygon);
    }

    public void onMarkerDrag(MarkerDragEvent event) {
        dibujarPoligono();
    }
    //</editor-fold>
}
